package com.practice.niuke.new_direct_basics.class06;

/**
 * 将一些题目中用 [weight, from节点上面的值(编号)，to节点上面的值(编号)] 形式 给出的 图描述，
 * 转换成 用我们“自己设计的图结构”描述
 */
public class GraphGenerator {

    // matrix 所有的边
    // N*3 的矩阵
    // [weight, from节点上面的值，to节点上面的值]
    public static Graph createGraph(Integer[][] matrix) {
        Graph graph = new Graph();
        for (int i = 0; i < matrix.length; i++) { // matrix[0][0], matrix[0][1]  matrix[0][2]
            Integer weight = matrix[i][0];
            Integer from = matrix[i][1];
            Integer to = matrix[i][2];
            if (!graph.nodes.containsKey(from)) {
                // 1.1 图的点集中不含有from的编号，新建from的节点加入到图的点集中
                graph.nodes.put(from, new Node(from));
            }
            if (!graph.nodes.containsKey(to)) {
                // 1.2 图的点集中不含有to的编号，新建to的节点加入到图的点集中
                graph.nodes.put(to, new Node(to));
            }
            Node fromNode = graph.nodes.get(from);
            Node toNode = graph.nodes.get(to);
            // 2. 新建从from到to的边
            Edge newEdge = new Edge(weight, fromNode, toNode);
            // 3.1 将to节点，加入到from节点的直接邻居节点集合中
            fromNode.nexts.add(toNode);
            // 3.2 将from节点的出度加1
            fromNode.out++;
            // 3.3 将to节点的入度加1
            toNode.in++;
            // 3.4 将从from到to的边加入到from节点的“发散出去的边”集合中
            fromNode.edges.add(newEdge);
            // 4. 向图中的边集合中加入从from到to的边
            graph.edges.add(newEdge);
        }
        return graph;
    }

}
